package br.com.treinamento.gestaoExperienciaProfissional.validator;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import br.com.treinamento.gestaoExperienciaProfissional.model.Pessoa;
import br.com.treinamento.gestaoExperienciaProfissional.service.PessoaService;
import br.com.treinamento.gestaoExperienciaProfissional.util.FacesUtil;
import br.com.treinamento.gestaoExperienciaProfissional.util.ValidadorUtil;

@FacesValidator("cpfValidator")
public class CpfValidator implements Validator{

	@Override
	public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
		Long idPessoa = (Long) component.getAttributes().get("idPessoa");
		String cpfSemFormatacao = ValidadorUtil.cpfSemFormatacao(value.toString());
		if (ValidadorUtil.validarCPF(cpfSemFormatacao)) {
			if (verificaCpfCadastrado(idPessoa, value.toString())) {
				mensagemCpfCadastrado();
			}
		} else{
			gerarErro(value);
		}

	}

	private void mensagemCpfCadastrado() {
		FacesMessage msg = new FacesMessage(FacesUtil.getMessage("pessoa.cpfCadastrado"));
		msg.setSeverity(FacesMessage.SEVERITY_ERROR);
		throw new ValidatorException(msg);
	}
	
	private boolean verificaCpfCadastrado(Long idPessoa, String cpf) {
		PessoaService pessoaService = new PessoaService();
		Pessoa pessoa = pessoaService.buscarPorCPF(cpf.toString());
		return pessoa != null && !pessoa.getId().equals(idPessoa);
	}
	
	private void gerarErro(Object value) {
		String mensagem = gerarMensagemErro(value.toString());
		FacesMessage msg = new FacesMessage(mensagem, mensagem);
		msg.setSeverity(FacesMessage.SEVERITY_ERROR);
		throw new ValidatorException(msg);
	}
	
	private String gerarMensagemErro(String value) {
		String mensagem = FacesUtil.getMessage("pessoa.cpfInvalido");
		String mensagem2 = FacesUtil.getMessage("pessoa.msgCpfInvalido");
		return mensagem + " '" +  value + "' "  + mensagem2;
	}
	
}
